package com.ecloud.common.base.result;

/**
 * 结果构造器
 *
 * @author LiuGangQiang Create in 2021/08/09
 */
public final class ResultBuilder {

    /**
     * 隐藏构造器
     *
     * @author LiuGangQiang Create in 2021/08/09
     */
    private ResultBuilder() {
    }

    /**
     * 通过 {@link ResultStatus} 构建无数据的响应对象 一般适用<font color="yellow"> 新增 | 修改 | 删除 </font>等写操作
     *
     * @author LiuGangQiang Create in 2021/04/02
     * @param <T>
     * @param status 状态枚举
     * @return {@link Result}
     */
    public static <T> Result<T> build(ResultStatus status) {
        return new Result<T>(status.getValue(), null, null, status.getKey());
    }

    /**
     * 通过 {@link ResultStatus} 和数据构建响应对象 一般适用<font color="yellow"> 查询 </font>等读操作
     *
     * @author LiuGangQiang Create in 2021/04/02
     * @param <T>
     * @param status 状态枚举
     * @param data   数据
     * @return {@link Result}
     */
    public static <T> Result<T> build(ResultStatus status, T data) {
        return new Result<T>(status.getValue(), data, null, status.getKey());
    }

    /**
     * 通过 {@link ResultStatus} 和数据以及资源键值构建响应对象 一般适用<font color="yellow"> 查询 </font>同时又需要自定义提示消息等读操作
     *
     * @author LiuGangQiang Create in 2021/04/02
     * @param <T>
     * @param status 状态枚举
     * @param data   数据
     * @return {@link Result}
     */
    public static <T> Result<T> build(ResultStatus status, T data, String key) {
        return new Result<T>(status.getValue(), data, null, key).setPath(Prompt.getFilepath());
    }

    /**
     * 通过<font color="yellow">状态码 数据 提示消息</font>构建返回响应对象
     *
     * @author LiuGangQiang Create in 2021/04/02
     * @param <T>
     * @param code 状态码
     * @param data 数据
     * @param msg  提示消息
     * @return {@link Result}
     */
    public static <T> Result<T> build(Integer code, T data, String msg) {
        return new Result<T>(code, data, msg, null);
    }
}
